package main

import (
	"fmt"
)

/**
执行用时：4 ms, 在所有 Go 提交中击败了56.79%的用户
内存消耗：2.3 MB, 在所有 Go 提交中击败了100.00%的用户
 */
func isNumber(s string) bool {

	numFlag, dotFlag, eFlag := false, false, false
	for i := 0; i < len(s); i++ {
		if s[i] >= '0' && s[i] <= '9' {
			// 如果是数字，则标记数字出现过
			numFlag = true
		} else if s[i] == '.' && !dotFlag && !eFlag {
			// 如果是 ‘.’, 则需要 ‘.‘没有出现过，并且 ‘e/E’ 没有出现过，才会进行标记
			dotFlag = true
		} else if is_e(s[i]) && !eFlag && numFlag {
			// 如果是 ‘e/E’, 则需要 ‘e/E’没有出现过，并且前面出现过数字，才会进行标记，并重置数字出现的标识
			eFlag = true
			numFlag = false
		} else if is_op(s[i]) && (i == 0 || is_e(s[i - 1])) {
			// 如果是 ‘+/-’, 则需要是第一个字符，或者前一个字符是 ‘e/E’
			continue
		} else {
			return false
		}
	}

	// 最后返回时，需要字符串中至少出现过数字，避免下列case: s == ‘.’ or ‘e/E’ or ‘+/e’ and etc…
	return numFlag
}

func is_e(c byte) bool {
	return c == 'e' || c == 'E'
}

func is_op(c byte) bool {
	return c == '+' || c == '-';
}

func main() {

	fmt.Println(isNumber("0"))
	fmt.Println(isNumber("1.e1"))
	fmt.Println(isNumber("2e2.5"))
}
